package modelo;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class Conexion {
    
	Connection conexion;
    PreparedStatement psInsertarCliente,psInsertarIngrediente,psInsertarCategoria,psInsertarProducto,psInsertarOrden,psInsertarProdIngre,psInsertarOrdenProd;
    PreparedStatement psConsultarCliente,psConsultarIngrediente,psConsultarOrden,psConsultarCategoria,psConsultarProducto;
    PreparedStatement psObtenerIngredientes;
    static PreparedStatement psContarIngredientes;
	PreparedStatement psObtenerCategorias;
    PreparedStatement psObtenerListaCodProducto;
    PreparedStatement psObtenerProdMontoAsc,psObtenerProdMontoDesc,psObtenerProdCantidadAsc,psObtenerProdVendCantidadDesc;
    PreparedStatement psIngredientesMasUsados,psObtIngProducto;
    PreparedStatement psObtenerCodIngrediente,psObtenerExistenciaProducto,psActualizaExistencia;
	static PreparedStatement psobtCantProdVend;
    PreparedStatement psActualizarCliente,psActualizarIngrediente,psActualizarCategoria,psActualizarProducto;
    PreparedStatement psObtenerCodCategoria,psObtenerCodProducto,psCargarPorCategoria;
  
	public Conexion() throws SQLException, ClassNotFoundException{
		Class.forName("org.postgresql.Driver");
		conexion=DriverManager.getConnection("jdbc:postgresql://localhost:5432/BD8-8","postgres","inginfo230689");
		//conexion.setAutoCommit(false);
		psInsertarCliente=conexion.prepareStatement("INSERT INTO cliente (cedula,nombre,apellido,direccion,telefono,email) VALUES(?,?,?,?,?,?)");
		psInsertarIngrediente=conexion.prepareStatement("INSERT INTO ingrediente  (codingrediente,descripcion,existencia,precio)VALUES(?,?,?,?)");
		psInsertarCategoria=conexion.prepareStatement("INSERT INTO categoria (codcategoria,descripcion)VALUES(?,?)");
		psInsertarProducto=conexion.prepareStatement("INSERT INTO producto  (codproducto,codcategoria,descripcion,precio,fecharegistro) VALUES (?,?,?,?,?)");
		psInsertarOrden=conexion.prepareStatement("INSERT INTO orden  (codorden,cedula,fecha,totalpagar) VALUES (?,?,?,?)");
		psInsertarProdIngre=conexion.prepareStatement("INSERT INTO ingredienteproducto (codproducto,codingrediente,cantidad) VALUES (?,?,?)");
		psInsertarOrdenProd=conexion.prepareStatement("INSERT INTO ordenproducto (codorden,codproducto,cantidad) VALUES (?,?,?)");
		psConsultarCliente=conexion.prepareStatement("SELECT * FROM cliente WHERE cedula = ?");
		psConsultarIngrediente=conexion.prepareStatement("SELECT * FROM ingrediente WHERE codingrediente = ?");
		psConsultarOrden=conexion.prepareStatement("SELECT * FROM orden WHERE codorden = ?");
		psConsultarCategoria=conexion.prepareStatement("SELECT * FROM categoria WHERE codcategoria = ?");
		psConsultarProducto=conexion.prepareStatement("SELECT * FROM producto WHERE codproducto = ?");
		psObtenerIngredientes=conexion.prepareStatement("SELECT * FROM ingrediente");
		psContarIngredientes=conexion.prepareStatement("SELECT * FROM ingrediente");
		psObtenerCategorias=conexion.prepareStatement("SELECT * FROM categoria");
		psObtenerListaCodProducto=conexion.prepareStatement("SELECT * FROM ingredienteproducto WHERE codproducto= ?");
		psObtenerProdMontoAsc=conexion.prepareStatement("SELECT descripcion,count(descripcion) as cantidad,(precio*count(descripcion)) as total from producto,ordenproducto where producto.codproducto=ordenproducto.codproducto group by descripcion,precio order by (precio*count(descripcion)) asc");
		psObtenerProdMontoDesc=conexion.prepareStatement("SELECT descripcion,count(descripcion) as cantidad,(precio*count(descripcion)) as total from producto,ordenproducto where producto.codproducto=ordenproducto.codproducto group by descripcion,precio order by (precio*count(descripcion)) desc");
		psObtenerProdCantidadAsc=conexion.prepareStatement("SELECT descripcion,count(descripcion) as cantidad,(precio*count(descripcion)) as total from producto,ordenproducto where producto.codproducto=ordenproducto.codproducto group by descripcion,precio order by count(descripcion) asc");
		psObtenerProdVendCantidadDesc=conexion.prepareStatement("SELECT descripcion,count(descripcion) as cantidad,(precio*count(descripcion)) as total from producto,ordenproducto where producto.codproducto=ordenproducto.codproducto group by descripcion,precio order by count(descripcion) desc");
		psIngredientesMasUsados=conexion.prepareStatement("SELECT ingrediente.descripcion as descripcioningrediente,count(ingrediente.descripcion) as cantidad FROM ingrediente,ingredienteproducto,producto where ingrediente.codingrediente=ingredienteproducto.codingrediente and producto.codproducto=ingredienteproducto.codproducto group by ingrediente.descripcion order by cantidad desc;");
		psObtIngProducto=conexion.prepareStatement("SELECT ingrediente.descripcion as descripcioningrediente,producto.descripcion as descripcionproducto FROM ingrediente,ingredienteproducto,producto where ingrediente.codingrediente=ingredienteproducto.codingrediente and producto.codproducto=ingredienteproducto.codproducto");
		psObtenerCodIngrediente=conexion.prepareStatement("SELECT codingrediente FROM ingrediente WHERE descripcion = ?");
		psobtCantProdVend=conexion.prepareStatement("SELECT descripcion,count(descripcion) as cantidad,(precio*count(descripcion)) as total from producto,ordenproducto where producto.codproducto=ordenproducto.codproducto group by descripcion,precio order by count(descripcion) asc");
		psObtenerExistenciaProducto=conexion.prepareStatement("SELECT existencia FROM ingrediente WHERE codingrediente= ?");
		psActualizaExistencia=conexion.prepareStatement("UPDATE ingrediente SET existencia= ? WHERE codingrediente= ?");
		psActualizarCliente=conexion.prepareStatement("UPDATE cliente SET nombre=?,apellido=?,telefono=?,email= ?,direccion = ? WHERE cedula= ?");
		psActualizarIngrediente=conexion.prepareStatement("UPDATE ingrediente SET descripcion=?,precio= ? WHERE codingrediente=?");
		psActualizarCategoria=conexion.prepareStatement("UPDATE categoria SET descripcion=? WHERE codcategoria=?");
		psActualizarProducto=conexion.prepareStatement("UPDATE producto SET codcategoria=?,descripcion=?,precio=?,fecharegistro=? WHERE codproducto=?");
		psObtenerCodCategoria=conexion.prepareStatement("SELECT codcategoria FROM categoria WHERE descripcion = ?");
		psObtenerCodProducto=conexion.prepareStatement("SELECT codproducto FROM producto WHERE descripcion = ?");
		psCargarPorCategoria=conexion.prepareStatement("SELECT * FROM producto where codcategoria=?");
	
}
public void insertarCliente(Cliente cliente){
	try {
		psInsertarCliente.setString(1,cliente.getCedula());
		psInsertarCliente.setString(2,cliente.getNombre());
		psInsertarCliente.setString(3,cliente.getApellido());
		psInsertarCliente.setString(4,cliente.getDireccion());
		psInsertarCliente.setString(5,cliente.getTelefono());
		psInsertarCliente.setString(6,cliente.getEMail());
		psInsertarCliente.execute();
		//conexion.commit();
	} catch (SQLException e) {
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	
}
public void insertarCategoria(Categoria categoria) {
	
	try {
		psInsertarCategoria.setString(1,categoria.getCategoria());
		psInsertarCategoria.setString(2,categoria.getDescripcion());
		psInsertarCategoria.execute();
		//conexion.commit();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	


}
public void insertarIngrediente(Ingrediente ingrediente){
	try {
		psInsertarIngrediente.setString(1,ingrediente.getCodIngrediente());
		psInsertarIngrediente.setString(2,ingrediente.getDescripcion());
		psInsertarIngrediente.setFloat(3,ingrediente.getExistencia());
		psInsertarIngrediente.setFloat(4,ingrediente.getPrecio());
		psInsertarIngrediente.execute();
		//conexion.commit();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	
	
}
public void insertarProducto(Producto producto){
	try {
		psInsertarProducto.setString(1,producto.getCodProducto());
		psInsertarProducto.setString(2,producto.getCodCategoria());
		psInsertarProducto.setString(3,producto.getDescripcion());
		psInsertarProducto.setFloat(4,producto.getPrecio());
		psInsertarProducto.setString(5,producto.getFechaRegistro());
		psInsertarProducto.execute();
		//conexion.commit();
	} catch (SQLException e) {
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	
}
public void insertarOrden(Orden orden){
	
	try {
		psInsertarOrden.setString(1,orden.getCodOrden());
		psInsertarOrden.setString(2,orden.getCedula());
		psInsertarOrden.setString(3,orden.getFecha());
		psInsertarOrden.setFloat(4,orden.getTotalPagar());	
		psInsertarOrden.execute();
		//conexion.commit();
	} catch (SQLException e) {
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	
}
   public void insertarIngredientesPorProductos(Vector<DetalleProducto> detallesProductos){
	   DetalleProducto detalle;
	   for(int i=0;i<detallesProductos.size();i++){
		   detalle=detallesProductos.elementAt(i); 
		   try {
			psInsertarProdIngre.setString(1,detalle.getCodProducto());
			psInsertarProdIngre.setString(2,detalle.getCodIngrediente());
			psInsertarProdIngre.setFloat(3,detalle.getCantidad());   
			psInsertarProdIngre.execute();
			//conexion.commit();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				conexion.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
	   }
	   
   }
   public void insertarOrdenPorProducto(Vector<DetalleOrden> detallesOrden){
	   DetalleOrden detalle;
	   for(int i=0;i<detallesOrden.size();i++){
		   detalle=detallesOrden.elementAt(i);
           try {
			psInsertarOrdenProd.setString(1,detalle.getCodOrden());
			psInsertarOrdenProd.setString(2,detalle.getCodProducto());
	        psInsertarOrdenProd.setInt(3,detalle.getCantidad());
	        psInsertarOrdenProd.execute();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				conexion.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
	   }
          
	   
   }
   public Cliente consultarCliente(String cedula){
	   Cliente cliente=null;
	   String nombre,apellido,direccion,telefono,email;
	   ResultSet rs;
	   try {
		psConsultarCliente.setString(1,cedula);
		  rs= psConsultarCliente.executeQuery();
		   if(rs.next()){
				nombre=rs.getString("nombre");
				apellido=rs.getString("apellido");
				direccion=rs.getString("direccion");
				telefono=rs.getString("telefono");
				email=rs.getString("email");
				cliente=new Cliente(apellido,cedula,direccion,email,nombre,telefono);
					
		   }
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	 
	   return cliente; 
   }
   public Ingrediente consultarIngrediente(String codIngrediente){
	   Ingrediente ingrediente=null;
	   ResultSet rs;
	   String descripcion;
	   float existencia,precio;
	   try {
		psConsultarIngrediente.setString(1,codIngrediente);
		rs=psConsultarIngrediente.executeQuery();
		   if(rs.next()){
			   descripcion=rs.getString("descripcion");
				existencia=rs.getFloat("existencia");
				precio=rs.getFloat("precio");
				ingrediente=new Ingrediente(codIngrediente,descripcion,existencia,precio);   
		   }
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	   
	   return ingrediente; 
   }
   public Categoria consultarCategoria(String codCategoria){
	   Categoria categoria=null;
	   ResultSet rs;
	   String descripcion;
	   try {
		psConsultarCategoria.setString(1,codCategoria);
		 rs=psConsultarCategoria.executeQuery();
		   if(rs.next()){
				descripcion=rs.getString("descripcion");
				categoria=new Categoria(codCategoria,descripcion);
		   }
		   
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		conexion.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	
	  
	   return categoria;
	   
   }
   public Orden consultarOrden(String codOrden){
	   Orden orden=null;
	   ResultSet rs;
	   String cedula,fecha;
	   float totalpagar;
	   try {
		psConsultarOrden.setString(1,codOrden);
		rs=psConsultarOrden.executeQuery();
		   if(rs.next()){
				cedula=rs.getString("cedula");
				fecha=rs.getString("fecha");
				totalpagar=rs.getFloat("totalpagar");
			orden=new Orden(cedula,codOrden,fecha,totalpagar);
		   }
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	   
	   return orden;   
   }
   public Producto consultarProducto(String codProducto){
	   Producto producto=null;
	   ResultSet rs;
	   String descripcion,fecharegistro,codcategoria;
	   float precio;
	   try {
		psConsultarProducto.setString(1,codProducto);
		 rs=psConsultarProducto.executeQuery();
		   if(rs.next()){
				descripcion=rs.getString("descripcion");
				codcategoria=rs.getString("codcategoria");
				fecharegistro=rs.getString("fecharegistro");
				precio=rs.getFloat("precio");
				producto=new Producto(codcategoria,codProducto,descripcion,fecharegistro,precio);
				}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	  
	   return producto;     
   }
   public Vector<String> cargarIngredientes(){
	   Vector<String> vIngredientes;
	   vIngredientes= new Vector<String>();
	   ResultSet rs;
	   try {
		rs=psObtenerIngredientes.executeQuery();
		 String des;
			while(rs.next()){
				des=rs.getString("descripcion");
				vIngredientes.add(des);
			}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	  
	   return vIngredientes;
   }
   public Vector<String> cargarCategorias(){
	   Vector<String> vCategorias;
	   vCategorias= new Vector<String>();
	   ResultSet rs;
	   try {
		rs=psObtenerCategorias.executeQuery();
		  String des;
			while(rs.next()){
				des=rs.getString("descripcion");
				vCategorias.add(des);
			}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 
	   return vCategorias;
   }
   public List<DetalleProducto> cargarIngredientesPorProductosCod(String codProducto){
		List<DetalleProducto> listaDetalles =new ArrayList<DetalleProducto>();
		DetalleProducto detalle;
		String codIngrediente;
		 ResultSet rs;
		float cantidad;
		try {
			psObtenerListaCodProducto.setString(1,codProducto);
			rs=psObtenerListaCodProducto.executeQuery();
			while(rs.next()){
				codIngrediente=rs.getString("codingrediente");
				cantidad=rs.getFloat("cantidad");
				detalle=new DetalleProducto(cantidad,codIngrediente,codProducto);
				listaDetalles.add(detalle);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return listaDetalles;
		}
   public ResultSet obtenerIngredientes(){
		ResultSet rs =null;
		try {
			rs=psObtenerIngredientes.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}

	public ResultSet obtenerProdMontoAsc(){
		ResultSet rs =null;
		try {
			rs=psObtenerProdMontoAsc.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	public ResultSet obtenerProdMontoDesc(){
		ResultSet rs = null;
		try {
			rs=psObtenerProdMontoDesc.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	public ResultSet obtenerProdCantidadAsc(){
		ResultSet rs = null;
		try {
			rs=psObtenerProdCantidadAsc.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	public ResultSet obtenerProdVendCantidadDesc(){
		ResultSet rs = null;
		try {
			rs=psObtenerProdVendCantidadDesc.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	public ResultSet obtenerIngredientesMasUsados(){
		ResultSet rs = null;	
		try {
			rs=psIngredientesMasUsados.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	public ResultSet obtenerIngredientesPorProducto(){
		ResultSet rs = null;
		try {
			rs=psObtIngProducto.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	public String ObtenerCodIngrediente(String nombreIngrediente){
	ResultSet rs;
	String codingrediente="";
	try {
		psObtenerCodIngrediente.setString(1,nombreIngrediente);
		rs=psObtenerCodIngrediente.executeQuery();
		rs.next();
		codingrediente=rs.getString("codingrediente");	
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
		
	return codingrediente;		
	}

	public static int contarIngrediente() {
		ResultSet rs;
		int i=0;
		try {
			rs=psContarIngredientes.executeQuery();
			while(rs.next())
				i++;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return i;		
		}
	public  static int obtenerCantidadProductoVendidos(){
		int i=0;
		ResultSet rs;
		try {
			rs=psobtCantProdVend.executeQuery();
			while(rs.next())
				i++;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
		return i;
	}
	public void comprarIngrediente(String codIngrediente,int cantidad){
		float existencia=0,total=0;
		ResultSet rs;
		try {
			psObtenerExistenciaProducto.setString(1,codIngrediente);
			rs=psObtenerExistenciaProducto.executeQuery();
			rs.next();
			existencia=rs.getFloat("existencia");
			total=existencia+cantidad;
			psActualizaExistencia.setFloat(1,total);
			psActualizaExistencia.setString(2,codIngrediente);
			psActualizaExistencia.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		}

	public void ActualizarIngredientesPorVenta(List<Ingrediente> ingredientes){
		String codingrediente="";
		Ingrediente ingrediente;
		ResultSet rs;
		try {
			rs=psObtenerIngredientes.executeQuery();
			while(rs.next()){
				codingrediente=rs.getString("codingrediente");
				for(int i=0;i<ingredientes.size();i++){
					ingrediente=ingredientes.get(i);
				  if(codingrediente.equals(ingrediente.getCodIngrediente())){
					  psActualizaExistencia.setFloat(1,ingrediente.getExistencia());
						psActualizaExistencia.setString(2,codingrediente);
						psActualizaExistencia.executeUpdate();
					   }
				 }
				}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
		}

	public void modificarCategoria(String codCategoria,Categoria categoria){
		try {
			psActualizarCategoria.setString(1,categoria.getDescripcion());
			psActualizarCategoria.setString(2,codCategoria);
			psActualizarCategoria.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
                            
	}
	public void modificarCliente(String cedula,Cliente cliente){
		try {
			psActualizarCliente.setString(1,cliente.getNombre());
			psActualizarCliente.setString(2,cliente.getApellido());
			psActualizarCliente.setString(3,cliente.getTelefono());
			psActualizarCliente.setString(4,cliente.getEMail());
			psActualizarCliente.setString(5,cliente.getDireccion());
			psActualizarCliente.setString(6,cedula);
			psActualizarCliente.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	public void modificarProducto(String codProducto,Producto producto){
		try {
			psActualizarProducto.setString(1,producto.getCodCategoria());
			psActualizarProducto.setString(2,producto.getDescripcion());
			psActualizarProducto.setFloat(3,producto.getPrecio());
			psActualizarProducto.setString(4,producto.getFechaRegistro());
			psActualizarProducto.setString(5,codProducto);
			psActualizarProducto.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	public void modificarIngrediente(String codIngrediente,Ingrediente ingrediente){
		try {
			psActualizarIngrediente.setString(1,ingrediente.getDescripcion());
			psActualizarIngrediente.setFloat(2,ingrediente.getPrecio());
			psActualizarIngrediente.setString(1,codIngrediente);
			psActualizarIngrediente.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public String ObtenerCodCategoria(String nombreCategoria){
	ResultSet rs;
	String codcategoria="";
	try {
		psObtenerCodCategoria.setString(1,nombreCategoria);
		rs=psObtenerCodCategoria.executeQuery();
		rs.next();
	    codcategoria=rs.getString("codcategoria");	
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	return codcategoria;			
	}
	public String ObtenerCodProducto(String nombreProducto){
		ResultSet rs;
		String codProducto="";
		try {
			psObtenerCodProducto.setString(1,nombreProducto);
			rs=psObtenerCodProducto.executeQuery();
			rs.next();
			codProducto=rs.getString("codproducto");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return codProducto;		
		}

	public Vector<String> cargarProductosCodicionados(String DescripcionCategoria){
		Vector<String> vProductos;
		ResultSet rs;
		vProductos= new Vector<String>();
		String codCategoria=this.ObtenerCodCategoria(DescripcionCategoria);
		try {
			psCargarPorCategoria.setString(1,codCategoria);
			rs=psCargarPorCategoria.executeQuery();
			String des;
				while(rs.next()){
						des=rs.getString("descripcion");
						vProductos.add(des);
					}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return vProductos;
	}
   
   
   
}